﻿class Date
{
	// 把运算符==重载的全局函数设置为Date类的友元函数
	// Date类的友元函数可以直接访问Date类对象的private部分
	friend bool operator==(const Date& d1, const Date& d2);
public:
	Date(int year = 1, int month = 1, int day = 1)
	{
		_year = year;
		_month = month;
		_day = day;
	}
	
private:
	int _year;
	int _month;
	int _day;
};

bool operator==(const Date& d1, const Date& d2)// 运算符==重载为全局函数
{
	return d1._year == d2._year
		&& d1._month == d2._month
		&& d1._day == d2._day;
}

int main()
{
	Date d1(2024, 7, 5);
	Date d2(2024, 7, 6);
	d1 == d2;// 编译器会转换成 operator==(d1, d2);
	operator==(d1, d2);// 运算符重载函数也可以显⽰调⽤
	return 0;
}


//// .* 操作符的使用场景
//#include<iostream>
//using namespace std;
//class A
//{
//public:
//	void func()
//	{
//		cout << "A::func()" << endl;
//	}
//};
//
//typedef void(A::* PF)(); //成员函数func()的指针类型为void(A::*)()，将其重命名为PF
//
//int main()
//{
//	// C++规定成员函数要加&才能取到函数指针
//	PF pf = &A::func;
//	A obj;//定义A类对象obj
//	// 对象调⽤成员函数指针时，使⽤.*运算符
//	(obj.*pf)();
//	return 0;
//}
//
//
////复用运算符重载函数可以提高写代码效率
//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	Date(int year=2008, int month=1, int day=1)// 全缺省的构造函数
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//
//	bool operator>(const Date& d)// >运算符重载
//	{
//		if (_year > d._year)
//			return true;
//		else if (_year == d._year && _month > d._month)
//			return true;
//		else if (_year == d._year && _month == d._month && _day > d._day)
//			return true;
//		else
//			return false;
//	}
//
//	bool operator==(const Date& d)// ==运算符重载
//	{
//		return _year == d._year && _month == d._month && _day == d._day;
//	}
//
//	bool operator<(const Date& d)// <运算符重载
//	{
//		return !(*this >= d);
//	}
//
//	bool operator>=(const Date& d)// >=运算符重载
//	{
//		return *this > d || *this == d;
//	}
//
//	bool operator<=(const Date& d)// <=运算符重载
//	{
//		return !(*this > d);
//	}
//
//	bool operator!=(const Date& d)// !=运算符重载
//	{
//		return !(*this == d);
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//int main()
//{
//	Date d1(2024, 5, 22);
//	Date d2(2008, 1, 5);
//	cout << (d1 > d2) << ' ' << (d1 >= d2) << ' ' << (d1 <= d2) << ' ' << (d1 != d2) << endl;
//	return 0;
//}
//
//
//// C++规定，后置++重载时，增加⼀个int形参，跟前置++构成函数重载，方便区分
//#include<iostream>
//using namespace std;
//class Date
//{
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//	int GetMonthDay(int year, int month)// 获取某年某月的天数
//	{
//		int monthday[13] = { -1,31,28,31,30,31,30,31,31,30,31,30,31 };
//		if (month == 2 && (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0))
//		{
//			return monthday[month] + 1;
//		}
//		return monthday[month];
//	}
//	Date& operator+=(int day)// 日期+=天数
//	{
//		_day += day;
//		while (_day > GetMonthDay(_year, _month))
//		{
//			_day -= GetMonthDay(_year, _month);
//			_month++;
//			if (_month > 12)
//			{
//				_month = 1;
//				_year++;
//			}
//		}
//		return *this;
//	}
//	Date& operator++()// 前置++
//	{
//		cout << "前置++" << endl;
//		*this += 1;
//		return *this;
//	}
//	Date operator++(int)// 后置++
//	{
//		cout << "后置++" << endl;
//		Date tmp;
//		*this += 1;
//		return tmp;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	Date d1(2024, 7, 5);
//	++d1;// 编译器会转换成 d1.operator++();
//	
//	d1++;// 编译器会转换成 d1.operator++(0);
//	return 0;
//}
//
//
//// 重载<<和>>时，需要重载为全局函数
//#include<iostream>
//using namespace std;
//class Date
//{
//	friend ostream& operator<<(ostream& out, const Date& d);
//	friend istream& operator>>(istream& in, Date& d);
//public:
//	Date(int year = 1, int month = 1, int day = 1)
//	{
//		_year = year;
//		_month = month;
//		_day = day;
//	}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//
//ostream& operator<<(ostream& out, const Date& d)
//{
//	out << d._year << "年" << d._month << "月" << d._day << "日" << endl;
//	return out;
//}
//
//istream& operator>>(istream& in, Date& d)
//{
//	cout << "请依次输入年月日:>";
//	in >> d._year >> d._month >> d._day;
//	return in;
//}
//
//int main()
//{
//	Date d1;
//	Date d2;
//	Date d3;
//	cin >> d1 >> d2 >> d3;
//	cout << d1 << d2 << d3 << endl;
//	return 0;
//}